from matplotlib import dates as mdates # 导入日期刻度工具以减少横轴拥挤
fig, axes = plt.subplots(2, 1, figsize=(12, 4.5), sharex=True) # 在实际发图单元创建共享日期轴双面板画布
axes[0].plot(df_stock['Date'], df_stock['Price_Normal'], 'g-', label='示例数据完整路径(仅供误差对照)', linewidth=2) # 绘制完整价格示例数据
axes[0].plot(df_stock['Date'], df_stock['ForwardFill'], 'b--', label='前向填充', linewidth=1.5) # 绘制前向填充价格
axes[0].plot(df_stock['Date'], df_stock['LinearInterp'], 'r--', label='线性插值', linewidth=1.5, alpha=0.7) # 绘制线性插值价格
axes[0].scatter(df_stock.loc[missing_rows, 'Date'], df_stock.loc[missing_rows, 'Price_Normal'], color='red', s=50, zorder=5, label='示例数据隐藏值(现实中不可观测)') # 标示仅用于误差核对的隐藏值
axes[0].set_ylabel('价格', fontsize=16) # 标注价格轴
axes[0].set_title('股票停牌处理示例数据:价格对比', fontsize=16) # 标明依据为课堂示例
axes[0].legend(fontsize=16,loc='center left',bbox_to_anchor=(1.01,.5),title='处理路径',title_fontsize=16) # 将上面板图例移出绘图区避免遮挡曲线、红点与日期
axes[0].grid(True, alpha=0.3) # 添加辅助网格
axes[1].plot(df_stock['Date'], df_stock['Return_Normal'], 'g-',
label='示例数据完整路径收益率', linewidth=2) # 绘制完整路径收益率
axes[1].plot(df_stock['Date'], df_stock['Return_FF'], 'b--',
label='前向填充收益率', linewidth=1.5) # 绘制前向填充收益率
axes[1].plot(df_stock['Date'], df_stock['Return_Lin'], 'r--',
label='线性插值收益率', linewidth=1.5, alpha=0.7) # 绘制线性插值收益率
axes[1].axhline(y=0, color='k', linestyle='-', linewidth=0.5) # 标出零收益基线
axes[1].set_xlabel('日期', fontsize=16) # 标注日期轴
axes[1].set_ylabel('日收益率', fontsize=16) # 标注收益率轴
axes[1].set_title('股票停牌处理示例数据:收益率对比', fontsize=16) # 标明依据为课堂示例
axes[1].legend(fontsize=16,loc='center left',bbox_to_anchor=(1.01,.5),title='收益率路径',title_fontsize=16) # 将下方面板图例移出绘图区避免遮挡收益线
axes[1].grid(True, alpha=0.3) # 添加辅助网格
axes[1].xaxis.set_major_locator(mdates.YearLocator(5)) # 每五年显示一个主刻度以减少日期拥挤
axes[1].xaxis.set_major_formatter(mdates.DateFormatter('%Y')) # 用四位年份格式化共享日期轴
axes[0].tick_params(axis='both',labelsize=16) # 保证上面板刻度可读
axes[1].tick_params(axis='both',labelsize=16) # 保证下面板刻度可读
plt.tight_layout(rect=(0,0,.70,1)) # 为右侧两面板图例预留独立空间
plt.show() # 在当前单元发出完整图形